package iks.render.anim 
{
	import flash.utils.Dictionary;
	
	/**
	 * 帧信息数据缓存, 管理已经生成的帧信息数据.
	 * @author Yao Zhenyu
	 */
	public final class KFrameInfoCache 
	{
		/// 构造函数
		public function KFrameInfoCache(pc : PrivateClass) 
		{
			if (!(pc is PrivateClass))
				throw new ArgumentError("KFrameInfoCache: 不能实例化 KFrameInfoCache 类");
				
			m_frameInfos = new Dictionary();
		}
		
///////////////////////////////////////////////////////////////////////////////////////////////////
// 公共域
///////////////////////////////////////////////////////////////////////////////////////////////////

		/**
		 * 获得 KFrameInfoCache 实例
		 */
		public static function get instance() : KFrameInfoCache
		{
			if (m_instance == null)
				m_instance = new KFrameInfoCache(new PrivateClass());
			
			return m_instance;
		}
		
		/**
		 * 添加帧信息数据, 如果数据已经存在, 则删除原始数据, 添加新的数据.
		 * @param	key 键
		 * @param	frameInfo 值
		 */
		public function addFrameInfo(key : Object, frameInfo : KFrameInfo) : void
		{
			var tmp : KFrameInfo = m_frameInfos[key];
			
			// 释放已经存在的资源
			if (tmp != null)
			{
				tmp.dispose();
				delete m_frameInfos[key];
			}
			
			m_frameInfos[key] = frameInfo;
		}
		
		/**
		 * 移除缓存的帧数据, 如果存在指定键的数据, 则删除键, 但不帮助删除键映射的 KFrameInfo 数据, 用户需要手动删除.
		 * @param	key 指定的删除键
		 * @return 如果存在指定键映射的数据, 返回其映射数据, 否则返回 null.
		 */
		public function removeFrameInfo(key : Object) : KFrameInfo
		{
			var tmp : KFrameInfo = m_frameInfos[key];
			
			if (tmp != null)
			{
				delete m_frameInfos[key];
				return tmp;
			}
			
			return null;
		}
		
		/**
		 * 从缓存中删除所有的键以及对应的帧数据.
		 */
		public function removeAllFrameInfos() : void
		{
			var keys : Vector.<Object> = new Vector.<Object>();
			
			for (var key : Object in m_frameInfos)
				keys.push(key);
				
			for each (key in keys)
			{
				m_frameInfos[key].dispose();
				delete m_frameInfos[key];
			}
		}
		
		/**
		 * 获得指定键对应的帧数据
		 * @param	key 指定键
		 * @return 如果存在指定键映射的帧数据, 则返回帧数据, 否则返回 null.
		 */
		public function getFrameInfoForKey(key : Object) : KFrameInfo
		{
			return m_frameInfos[key];
		}

///////////////////////////////////////////////////////////////////////////////////////////////////
// 私有域
///////////////////////////////////////////////////////////////////////////////////////////////////
		
		private static var m_instance : KFrameInfoCache = null;
		private var m_frameInfos : Dictionary = null;
	}

}

class PrivateClass
{
}

































///////////////////////////////////////////////////////////////////////////////////////////////////
// end file


